﻿package com.zouloux.core.data.remote 
{
	import com.zouloux.core.events.RemoteEvent;
	import com.zouloux.core.IDisposable;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.SecurityErrorEvent;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	/**
	 * ...
	 * @author ZoulouX
	 */
	public class XMLRemote extends ARemote implements IRemote, IDisposable
	{
		/**
		 * Le chargeur XML
		 */
		protected var _xmlLoader			:URLLoader;
		
		/**
		 * Commande XML pour les models
		 */
		public function XMLRemote ()
		{
			
		}
		
		/**
		 * Commencer le chargement
		 */
		override public function call (pUrl:String, pOptions:Object = null, ... rest):void
		{
			// Supprimer
			dispose();
			
			// Créer
			_xmlLoader = new URLLoader(new URLRequest(pUrl));
			_xmlLoader.addEventListener(IOErrorEvent.IO_ERROR, loadErrorHandler);
			_xmlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
			_xmlLoader.addEventListener(Event.COMPLETE, loadCompleteHandler);	
		}
		
		/**
		 * Chargement du fichier XML terminé
		 * @param	event
		 */
		protected function loadCompleteHandler (event:Event):void 
		{
			// Essayer de convertir les données en XML
			try
			{
				var xml:XML = new XML(_xmlLoader.data);
			}
			catch (e:Error)
			{
				
			}
		}
		
		/**
		 * Erreur de chargement
		 * @param	event
		 */
		protected function loadErrorHandler (event:IOErrorEvent):void 
		{
			// L'event d'erreur
			var eventOut:RemoteEvent = new RemoteEvent(RemoteEvent.ERROR);
			eventOut.message = "ioError";
			eventOut.cause = 4;
			dispatchEvent(eventOut);
		}
		
		/**
		 * Erreur de sécurité
		 * @param	event
		 */
		protected function securityErrorHandler (event:SecurityErrorEvent):void 
		{
			// L'event d'erreur
			var eventOut:RemoteEvent = new RemoteEvent(RemoteEvent.ERROR);
			eventOut.message = "securityError";
			eventOut.cause = 4;
			dispatchEvent(eventOut);
		}
		
		/**
		 * Supprimer
		 */
		public function dispose ():void
		{
			// Vérifier s'il y avait déjà un loader
			if (_xmlLoader)
			{
				_xmlLoader.removeEventListener(IOErrorEvent.IO_ERROR, loadErrorHandler);
				_xmlLoader.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
				_xmlLoader.removeEventListener(Event.COMPLETE, loadCompleteHandler);
				_xmlLoader = null;
			}
		}
	}
}